package com.cskaoyan.javase._2polymorphic._4cast;

/**
 * (重点)向下转型
 * 强转(向下转向): 父类引用 --> 子类引用
 * 父类的引用转换成子类的引用，在继承链中属于向下，属于"向下转型"。编译器默认不允许，需要显式地写代码完成类型转换。
 * 语法：
 * 子类类名 对象名 = （子类类名）父类引用;
 * 当然上述语法不是乱写地，向下转型是有条件的。
 *
 * 能够通过编译的条件:
 * 必须是同一条继承链中的父子类,强转必须是把父类引用强转成继承链中的子类引用
 *
 * 但是如果随意进行向下转型,把父类对象当成子类使用,是肯定不可能的
 * 强行启动程序,就会程序运行报错,抛出异常: ClassCastException 类型转换异常
 *
 * 向下转型能够正常运行成功的前提条件是什么呢?
 * 条件:
 *      强转要想成功,总之强转后的引用必须是真的能够指向原先父类引用指向的对象
 *      具体来说就是:
 *              1.强转后的引用,是原先父类引用指向的对象的父类引用(父类引用可以指向子类对象)
 *              2.强转后的引用,是原先父类引用指向的对象的自身引用(自身引用肯定可以指向自身对象)
 *
 * @since 11:48
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*Grandfather gf = new Grandfather();
        Son s = (Son) gf;
        Grandson g = (Grandson) gf;*/
        // ((String) gf)

        /*Grandfather gf = new Grandson();
        Father f = (Father) gf;
        Son s = (Son) gf;
        Grandson g = (Grandson) gf;*/

        /*Father f = new Grandson();
        Son s = (Son) f;
        Grandson g = (Grandson) f;*/

        Object o = new Grandson();
        Grandfather gf = (Grandfather) o;
        Father f = (Father) o;
        Son s = (Son) o;
        Grandson g = (Grandson) o;
    }
}

class Grandfather {
}

class Father extends Grandfather {
}

class Son extends Father {
}

class Grandson extends Son {
}